package com.wyix;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.time.Instant;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.Scanner;

/**
 * @author wangdx
 * @since 2025/8/1
 */
public class StudentFileManager {
    // 数据文件路径（使用 Path 确保跨平台兼容性）
    private static final Path STUDENT_FILE = Paths.get("data", "students.txt");

    public static void main(String[] args) {
//        Scanner scanner = new Scanner(System.in);
//        System.out.println("===== 学生信息管理系统 =====");
//        System.out.print("请输入学生学号：");
//        String id = scanner.next();
//        System.out.print("请输入学生姓名：");
//        String name = scanner.next();
//        System.out.print("请输入学生年龄：");
//        int age = scanner.nextInt();
//        System.out.print("请输入学生成绩：");
//        int score = scanner.nextInt();
//
//        // 添加学生信息到文件
//        addStudent(id, name, age, score);
//        scanner.close();
        // 读取并打印所有学生信息
//        printAllStudents();
//        updateStudentScore("1", 98);
//        printAllStudents();
        backupStudentData();
    }

    /**
     * 读取所有学生信息并打印
     */
    public static void printAllStudents() {
        // 检查文件是否存在
        if (Files.notExists(STUDENT_FILE)) {
            System.out.println("暂无学生信息，请先添加数据！");
            return;
        }

        // 使用 Files.newBufferedReader 读取，指定 UTF-8 编码
        try (BufferedReader reader = Files.newBufferedReader(STUDENT_FILE, StandardCharsets.UTF_8)) {
            System.out.println("\n===== 所有学生信息 =====");
            System.out.println("学号\t姓名\t年龄\t成绩");
            System.out.println("------------------------");
            String line;
            while ((line = reader.readLine()) != null) { // 逐行读取
                String[] parts = line.split(","); // 按逗号分割字段
                if (parts.length == 4) { // 校验格式
                    System.out.printf("%s\t%s\t%s\t%s%n", parts[0], parts[1], parts[2], parts[3]);
                } else {
                    System.out.println("无效数据行：" + line);
                }
            }
        } catch (IOException e) {
            System.err.println("读取信息失败：" + e.getMessage());
        }
    }

    /**
     * 添加学生信息到文件（追加模式，UTF-8 编码）
     */
    private static void addStudent(String id, String name, int age, int score) {
        // 1. 确保父目录存在（data 文件夹）
        try {
            Files.createDirectories(STUDENT_FILE.getParent()); // 若 data 目录不存在则创建
        } catch (IOException e) {
            System.err.println("创建目录失败：" + e.getMessage());
            return;
        }

        // 2. 追加学生信息到文件（使用 try-with-resources 自动关闭流）
        String studentInfo = String.format("%s,%s,%d,%d%n", id, name, age, score);
        try (BufferedWriter writer = Files.newBufferedWriter(
                STUDENT_FILE,
                StandardCharsets.UTF_8,  // 显式指定 UTF-8 编码，避免中文乱码
                StandardOpenOption.CREATE,  // 文件不存在则创建
                StandardOpenOption.APPEND)) { // 追加模式（不覆盖原有内容）
            writer.write(studentInfo);
            System.out.println("学生信息添加成功！");
        } catch (IOException e) {
            System.err.println("添加信息失败：" + e.getMessage());
        }
    }

    /**
     * 更新指定学号学生的成绩
     *
     * @param targetId 目标学生学号
     * @param newScore 新成绩
     */
    public static void updateStudentScore(String targetId, int newScore) {
        if (Files.notExists(STUDENT_FILE)) {
            System.out.println("学生数据文件不存在！");
            return;
        }

        // 1. 读取所有行到列表（小文件适用）
        List<String> lines;
        try {
            lines = Files.readAllLines(STUDENT_FILE, StandardCharsets.UTF_8);
        } catch (IOException e) {
            System.err.println("读取数据失败：" + e.getMessage());
            return;
        }

        // 2. 遍历行，查找并更新目标学生
        boolean updated = false;
        for (int i = 0; i < lines.size(); i++) {
            String line = lines.get(i);
            String[] parts = line.split(",");
            if (parts.length == 4 && parts[0].equals(targetId)) { // 匹配学号
                // 构造新行（保持其他字段不变，更新成绩）
                lines.set(i, String.format("%s,%s,%s,%d", parts[0], parts[1], parts[2], newScore));
                updated = true;
                break;
            }
        }

        // 3. 写回文件（覆盖原内容）
        if (updated) {
            try {
                Files.write(STUDENT_FILE, lines, StandardCharsets.UTF_8);
                System.out.println("成绩更新成功！");
            } catch (IOException e) {
                System.err.println("更新文件失败：" + e.getMessage());
            }
        } else {
            System.out.println("未找到学号为 " + targetId + " 的学生！");
        }
    }

    /**
     * 备份学生数据到 backup/日期 目录
     */
    public static void backupStudentData() {
        // 创建备份目录（如 backup/20240520）
        String date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        Path backupDir = Paths.get("backup", date);
        Path backupFile = backupDir.resolve(STUDENT_FILE.getFileName()); // 备份文件名与原文件相同

        try {
            // 创建备份目录（父目录不存在则自动创建）
            Files.createDirectories(backupDir);
            // 复制文件，若备份文件已存在则覆盖
            Files.copy(
                    STUDENT_FILE,
                    backupFile,
                    StandardCopyOption.REPLACE_EXISTING,  // 覆盖已有备份
                    StandardCopyOption.COPY_ATTRIBUTES);   // 复制文件属性（如修改时间）
            System.out.println("数据备份成功！备份路径：" + backupFile);
        } catch (IOException e) {
            System.err.println("备份失败：" + e.getMessage());
        }
    }


    /**
     * 清理 backup 目录下 30 天前的备份文件
     */
    public static void cleanOldBackups() {
        Path backupRoot = Paths.get("backup");
        if (Files.notExists(backupRoot)) {
            System.out.println("备份目录不存在，无需清理！");
            return;
        }

        // 计算 30 天前的时间戳
        Instant thirtyDaysAgo = Instant.now().minus(30, ChronoUnit.DAYS);

        try {
            // 遍历 backup 目录下的所有子目录（按日期命名）
            Files.walkFileTree(backupRoot, new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                    // 检查文件最后修改时间是否早于 30 天前
                    if (attrs.lastModifiedTime().toInstant().isBefore(thirtyDaysAgo)) {
                        Files.delete(file);
                        System.out.println("已删除过期文件：" + file);
                    }
                    return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
                    // 若目录为空，删除空目录
                    if (Files.list(dir).count() == 0) {
                        Files.delete(dir);
                        System.out.println("已删除空目录：" + dir);
                    }
                    return FileVisitResult.CONTINUE;
                }
            });
            System.out.println("过期备份清理完成！");
        } catch (IOException e) {
            System.err.println("清理备份失败：" + e.getMessage());
        }
    }
}
